﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using Vizzio.Models;
using Vizzio.DAL;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;

namespace Vizzio.Controllers
{
    public class PedidoController : Controller
    {
        private VizzioContext db = new VizzioContext();


        // GET: /Pedido/
        public ActionResult Index()
        {
            var pedidoes = db.Pedidoes.Include(p => p.Cliente).Include(p => p.ProductoPedidos);

            var clientes = (from p in db.Pedidoes
                            join c in db.Clientes on p.ClienteID equals c.ClienteID
                            join s in db.Socios on p.idSocio equals s.SocioID
                            select new { 
                                        idPedido = p.PedidoID,
                                        nombreSocio = s.Nombre,
                                        apellidoSocio = s.Apellidos,
                                        nombreCliente = c.Nombre,
                                        apellidoCliente = c.Apellidos,
                                        estado = p.Estado,
                                        costoTotal = p.CostoTotal,
                                        fecha = p.Fecha
                            }).ToList();
            List<PedidoDeCliente> pdc = new List<PedidoDeCliente>();
            foreach (var item in clientes)
            {
                PedidoDeCliente filaCliente = new PedidoDeCliente();
                filaCliente.nombreSocio = item.nombreSocio;
                filaCliente.nombreCliente = item.nombreCliente;
                filaCliente.apellidoCliente = item.apellidoCliente;
                filaCliente.apellidoSocio = item.apellidoSocio;
                filaCliente.costoTotal = item.costoTotal;
                filaCliente.estado = item.estado;
                filaCliente.idPedido = item.idPedido;
                filaCliente.fecha = item.fecha;
                pdc.Add(filaCliente);
                
            }
            ViewBag.clientes = pdc;
            var socios = (from s in db.Pedidoes
                          join ds in db.Socios on s.idSocio equals ds.SocioID
                          where s.Tipo == "socio"
                          select new { 

                                      nombre = ds.Nombre,
                                      apellido = ds.Apellidos,
                                      fecha = s.Fecha,
                                      estado = s.Estado,
                                      costoTotal = s.CostoTotal,
                                      PedidoID = s.PedidoID
                                    }).ToList();
            List<PedidoDeSocio> listaSocios = new List<PedidoDeSocio>();
            foreach (var item in socios)
            {
                PedidoDeSocio pds = new PedidoDeSocio();
                pds.Nombre = item.nombre;
                pds.Apellido = item.apellido;
                pds.CostoTotal = item.costoTotal;
                pds.Fecha = item.fecha;
                pds.Estado = item.estado;
                pds.PedidoID = item.PedidoID;
                listaSocios.Add(pds);
            }
            ViewBag.socios = listaSocios;
            var ajustes = (from s in db.Pedidoes
                          where s.Tipo == "ajuste"
                          select s
             ).ToList();
            ViewBag.ajustes = ajustes;
            return View(pedidoes.ToList());
        }

        // GET: /Pedido/DespacharProductosCliente
        public ActionResult DespacharProductosCliente(int id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Pedido pedido = new Pedido();
            pedido = db.Pedidoes.Find(id);
            if (pedido == null)
            {
                return HttpNotFound();
            }
            var productosDePedido = (from p in db.Productoes
                                     join pp in db.ProductoPedidos on p.ProductoID equals pp.ProductoID
                                     where pp.PedidoID == id
                                     select new
                                     {
                                        nombre = p.Nombre,
                                         empresa =p.Empresa,
                                         cantidad = pp.Cantidad,
                                         precio = p.Precio,
                                         presentacion = p.Presentacion.NombrePresentacion,
                                         idProducto = pp.ProductoID,
                                         idPedido = pp.PedidoID

                                     }).ToList();
                List<ProductoDePedido> detallesDePedido = new List<ProductoDePedido>();
                foreach (var item in productosDePedido)
                {
                    ProductoDePedido pdp = new ProductoDePedido();
                    pdp.Nombre = item.nombre;
                    pdp.Empresa = item.empresa;
                    pdp.Cantidad = item.cantidad;
                    pdp.Presentacion = item.presentacion;
                    pdp.Costo = (item.precio * item.cantidad);
                    pdp.productoID = item.idProducto;
                    pdp.pedidoID = item.idPedido;
                    detallesDePedido.Add(pdp);
                    
                }
                ViewBag.productos = detallesDePedido;

                var pedidoCliente = (from c in db.Clientes
                                     join p in db.Pedidoes on c.ClienteID equals p.ClienteID
                                     join s in db.Socios on c.SocioID equals s.SocioID
                                     select new
                                     {
                                         nombreCliente = c.Nombre + " " + c.Apellidos,
                                         nombreSocio = s.Nombre + " " + s.Apellidos,
                                     }
                                    ).FirstOrDefault();

                ViewBag.nombreCliente = pedidoCliente.nombreCliente;
                ViewBag.nombreSocio = pedidoCliente.nombreSocio;
                return View(pedido);
        }

        [HttpPost]
        public ActionResult DespacharProductosCliente(ICollection<SalidaPorPedido> SalidaPorPedido)
        {
            try
            {
            var auxPedido = 0;
            foreach (var item in SalidaPorPedido)
            {
                auxPedido = item.PedidoID;
                SalidaPorPedido spp = new SalidaPorPedido();
                ProductoPedido pp = new ProductoPedido();
                pp = db.ProductoPedidos.Single(p => p.PedidoID == item.PedidoID && p.ProductoID == item.ProductoID);
                pp.Cantidad = pp.Cantidad - item.cantidad;
                db.SaveChanges();
                spp.ProductoID = item.ProductoID;
                spp.PedidoID = item.PedidoID;
                spp.cantidad = item.cantidad;
                spp.fecha = DateTime.Now;
                spp.saldo = pp.Cantidad - item.cantidad;
                db.SalidaPorPedidos.Add(spp);
                db.SaveChanges();
            }

            var queryDespachado = (from pp in db.SalidaPorPedidos
                                   where pp.PedidoID == auxPedido
                                   select new
                                   {
                                       pp.saldo,
                                       pp.ProductoID
                                   }).ToList();
            var sumaTotal = 0;
            foreach (var item in queryDespachado)
            {
                sumaTotal = sumaTotal + item.saldo;
            }
            if (sumaTotal == 0) {
                Pedido pe = new Pedido();
                pe = db.Pedidoes.Single(p => p.PedidoID == auxPedido);
                pe.Estado = "despachado";
                db.SaveChanges();
            }
            }
            catch 
            {
                
             
            }

            return RedirectToAction("Index");
        }

        [HttpPost]
        public ActionResult DespacharProductosClienteTotal(int id)
        {
            Pedido pd = new Pedido();
            pd = db.Pedidoes.Single(p => p.PedidoID == id);
            pd.Estado = "Despachado";
            db.SaveChanges();

            
            return RedirectToAction("Index");
        }

       // GET: /Pedido/DespacharProductosSocio
        public ActionResult DespacharProductosSocio(int id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Pedido pedido = new Pedido();
            pedido = db.Pedidoes.Find(id);
            if (pedido == null)
            {
                return HttpNotFound();
            }
            var productosDePedido = (from p in db.Productoes
                                     join pp in db.ProductoPedidos on p.ProductoID equals pp.ProductoID
                                     where pp.PedidoID == id
                                     select new
                                     {
                                         p.Nombre,
                                         p.Empresa,
                                         pp.Cantidad,
                                         p.Precio,
                                         p.Presentacion,
                                         idProducto = pp.ProductoID,
                                         idPedido = pp.PedidoID

                                     }).ToList();
            List<ProductoDePedido> detallesDePedido = new List<ProductoDePedido>();
            foreach (var item in productosDePedido)
            {
                ProductoDePedido pdp = new ProductoDePedido();
                pdp.Nombre = item.Nombre;
                pdp.Empresa = item.Empresa;
                pdp.Cantidad = item.Cantidad;
                pdp.Presentacion = item.Presentacion.NombrePresentacion;
                pdp.Costo = (item.Precio * item.Cantidad);
                pdp.productoID = item.idProducto;
                pdp.pedidoID = item.idPedido;
                detallesDePedido.Add(pdp);
            }
            ViewBag.productos = detallesDePedido;
                var pedidoSocio = (from c in db.Clientes
                                   join p in db.Pedidoes on c.ClienteID equals p.ClienteID
                                   join s in db.Socios on c.SocioID equals s.SocioID
                                   select new
                                   {
                                       nombreSocio = s.Nombre + " " + s.Apellidos
                                   }
                    ).FirstOrDefault();
                ViewBag.nombreSocio = pedidoSocio.nombreSocio;

            return View(pedido);
        }
        [HttpPost]
        public ActionResult DespacharProductosSocio(ICollection<SalidaPorPedido> SalidaPorPedido)
        {
            try
            {
                var auxPedido = 0;
                foreach (var item in SalidaPorPedido)
                {
                    auxPedido = item.PedidoID;
                    SalidaPorPedido spp = new SalidaPorPedido();
                    ProductoPedido pp = new ProductoPedido();
                    pp = db.ProductoPedidos.Single(p => p.PedidoID == item.PedidoID && p.ProductoID == item.ProductoID);
                    pp.Cantidad = pp.Cantidad - item.cantidad;
                    db.SaveChanges();
                    spp.ProductoID = item.ProductoID;
                    spp.PedidoID = item.PedidoID;
                    spp.cantidad = item.cantidad;
                    spp.fecha = DateTime.Now;
                    spp.saldo = pp.Cantidad - item.cantidad;
                    db.SalidaPorPedidos.Add(spp);
                    db.SaveChanges();
                }

                var queryDespachado = (from pp in db.SalidaPorPedidos
                                       where pp.PedidoID == auxPedido
                                       select new
                                       {
                                           pp.saldo,
                                           pp.ProductoID
                                       }).ToList();
                var sumaTotal = 0;
                foreach (var item in queryDespachado)
                {
                    sumaTotal = sumaTotal + item.saldo;
                }
                if (sumaTotal == 0)
                {
                    Pedido pe = new Pedido();
                    pe = db.Pedidoes.Single(p => p.PedidoID == auxPedido);
                    pe.Estado = "despachado";
                    db.SaveChanges();
                }
            }
            catch
            {


            }

            return RedirectToAction("Index");
        }
        // GET: /Pedido/DespacharProductosAjuste
        public ActionResult DespacharProductosAjuste(int id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Pedido pedido = new Pedido();
            pedido = db.Pedidoes.Find(id);
            if (pedido == null)
            {
                return HttpNotFound();
            }
            var productosDePedido = (from p in db.Productoes
                                     join pp in db.ProductoPedidos on p.ProductoID equals pp.ProductoID
                                     where pp.PedidoID == id
                                     select new
                                     {
                                         p.Nombre,
                                         p.Empresa,
                                         pp.Cantidad,
                                         p.Precio,
                                         p.Presentacion,
                                         idProducto = pp.ProductoID,
                                         idPedido = pp.PedidoID

                                     }).ToList();
            List<ProductoDePedido> detallesDePedido = new List<ProductoDePedido>();
            foreach (var item in productosDePedido)
            {
                ProductoDePedido pdp = new ProductoDePedido();
                pdp.Nombre = item.Nombre;
                pdp.Empresa = item.Empresa;
                pdp.Cantidad = item.Cantidad;
                pdp.Presentacion = item.Presentacion.NombrePresentacion;
                pdp.Costo = (item.Precio * item.Cantidad);
                pdp.productoID = item.idProducto;
                pdp.pedidoID = item.idPedido;
                detallesDePedido.Add(pdp);
            }
            ViewBag.productos = detallesDePedido;
            var pedidoAjuste = (from c in db.Clientes
                               join p in db.Pedidoes on c.ClienteID equals p.ClienteID
                               join s in db.Socios on c.SocioID equals s.SocioID
                               select new
                               {
                                   estado = p.Estado,
                                   fechaPedido = p.Fecha
                               }
                ).FirstOrDefault();
            ViewBag.detallePedido = pedidoAjuste;
            return View(pedido);
        }

        [HttpPost]
        public ActionResult DespacharProductosAjuste(ICollection<SalidaPorPedido> SalidaPorPedido)
        {
            try
            {
                var auxPedido = 0;
                foreach (var item in SalidaPorPedido)
                {
                    auxPedido = item.PedidoID;
                    SalidaPorPedido spp = new SalidaPorPedido();
                    ProductoPedido pp = new ProductoPedido();
                    pp = db.ProductoPedidos.Single(p => p.PedidoID == item.PedidoID && p.ProductoID == item.ProductoID);
                    pp.Cantidad = pp.Cantidad - item.cantidad;
                    db.SaveChanges();
                    spp.ProductoID = item.ProductoID;
                    spp.PedidoID = item.PedidoID;
                    spp.cantidad = item.cantidad;
                    spp.fecha = DateTime.Now;
                    spp.saldo = pp.Cantidad - item.cantidad;
                    db.SalidaPorPedidos.Add(spp);
                    db.SaveChanges();
                }

                var queryDespachado = (from pp in db.SalidaPorPedidos
                                       where pp.PedidoID == auxPedido
                                       select new
                                       {
                                           pp.saldo,
                                           pp.ProductoID
                                       }).ToList();
                var sumaTotal = 0;
                foreach (var item in queryDespachado)
                {
                    sumaTotal = sumaTotal + item.saldo;
                }
                if (sumaTotal == 0)
                {
                    Pedido pe = new Pedido();
                    pe = db.Pedidoes.Single(p => p.PedidoID == auxPedido);
                    pe.Estado = "despachado";
                    db.SaveChanges();
                }
            }
            catch
            {


            }

            return RedirectToAction("Index");
        }
        // GET: /Pedido/Details/5
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Pedido pedido = db.Pedidoes.Find(id);
            if (pedido == null)
            {
                return HttpNotFound();
            }

            var productosDePedido = (from p in db.Productoes
                                                        join pp in db.ProductoPedidos on p.ProductoID equals pp.ProductoID
                                                        where pp.PedidoID == id
                                                        select new { 
                                                                        p.Nombre,
                                                                        p.Empresa,
                                                                        pp.Cantidad,
                                                                        p.Precio,
                                                                        p.Presentacion

                                                        }).ToList();
            List<ProductoDePedido> detallesDePedido = new List<ProductoDePedido>();
            foreach (var item in productosDePedido)
	            {
                    ProductoDePedido pdp = new ProductoDePedido();
                    pdp.Nombre = item.Nombre;
                    pdp.Empresa = item.Empresa;
                    pdp.Cantidad = item.Cantidad;
                    pdp.Presentacion = item.Presentacion.NombrePresentacion;
                    pdp.Costo = (item.Precio * item.Cantidad);
                    detallesDePedido.Add(pdp);
	            }
            ViewBag.productos = detallesDePedido;

            //var socio = (from p in db.Pedidoes
            //             join c in db.Clientes on p.ClienteID equals c.ClienteID
            //             join s in db.Socios on c.SocioID equals s.SocioID
            //             where p.PedidoID == id
            //             select new
            //             {

            //                 nombre = s.Nombre,
            //                 apellido = s.Apellidos,
            //                 nombreCliente = c.Nombre,
            //                 apellidoCliente = c.Apellidos,
            //                 numeroPedido = p.PedidoID

            //             }
            //                 ).FirstOrDefault();
            //ViewBag.nombreSocio = socio.nombre + " " + socio.apellido;
            //ViewBag.nombreCliente = socio.nombreCliente + " " + socio.apellidoCliente;
            //ViewBag.numeroPedido = socio.numeroPedido;
            return View(pedido);
        }



        public ActionResult Buscar(string Nombre, string Apellidos)
        {
            //var pedidos = db.Pedidoes.Include(p => p.Cliente.Nombre.ToLower().Contains(Nombre)).Include(p => p.Cliente.Nombre.ToLower().Contains(Apellidos)).Include(p => p.ProductoPedidos);
            List<Pedido> pedidos = (from p in db.Pedidoes
                           join c in db.Clientes 
                           on p.ClienteID equals c.ClienteID join scio in db.Socios on c.SocioID equals scio.SocioID
                           where c.Nombre.Contains(Nombre) && c.Apellidos.Contains(Apellidos) && p.Tipo == "cliente"
                           select   p).ToList();
            /////lista de socios
            var socios = (from s in db.Pedidoes
                          join ds in db.Socios on s.idSocio equals ds.SocioID
                          where s.Tipo == "socio"
                          select new
                          {

                              nombre = ds.Nombre,
                              apellido = ds.Apellidos,
                              fecha = s.Fecha,
                              estado = s.Estado,
                              costoTotal = s.CostoTotal,
                              PedidoID = s.PedidoID
                          }).ToList();
            List<PedidoDeSocio> listaSocios = new List<PedidoDeSocio>();
            foreach (var item in socios)
            {
                PedidoDeSocio pds = new PedidoDeSocio();
                pds.Nombre = item.nombre;
                pds.Apellido = item.apellido;
                pds.CostoTotal = item.costoTotal;
                pds.Fecha = item.fecha;
                pds.Estado = item.estado;
                pds.PedidoID = item.PedidoID;
                listaSocios.Add(pds);
            }
            ViewBag.socios = listaSocios;
            /////lista ajustes
            var ajustes = (from s in db.Pedidoes
                           where s.Tipo == "ajuste"
                           select s
             ).ToList();
            ViewBag.ajustes = ajustes;
            
            return View("Index", pedidos);
        }


        // GET: /Pedido/Create
      
        public ActionResult Create()
        {
            IEnumerable<Socio> socios = db.Socios.ToList();
            socios = socios.Where(s => s.Eliminado == false);
            var query = (from s in db.Socios
                         select new { 

                                      NombreCompleto= s.Nombre + " "+ s.Apellidos,
                                      SocioID = s.SocioID
                                     }).ToList();
           var queryNumeroPedido = (from p in db.Pedidoes
                                     orderby p.PedidoID descending
                                    select p.PedidoID).Take(1).ToList();
           int pid = 0;
           if (queryNumeroPedido.Count == 0)
               pid = 1;
           else
           {
               foreach (var item in queryNumeroPedido)
               {
                   pid = item;
               }
           }
           
            ViewBag.PedidoID = ++ pid;
            ViewBag.Socios = new SelectList(query,"SocioID","NombreCompleto",null);//new SelectList(socios, "SocioID", "Nombre", null);
            ViewBag.ClienteID = new SelectList(new List<Cliente>(), "ClienteID", "Nombre");
            ViewBag.ProductoID = new SelectList(db.Productoes, "ProductoID", "Nombre");
            return View();
        }

        // POST: /Pedido/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(Pedido pedido, ICollection<ProductoPedido> productos,string socios)
        {
            try
            {
                if (pedido.Tipo == "ajuste") { pedido.ClienteID = null; pedido.idSocio = 0; }
                if (pedido.Tipo == "socio") { pedido.idSocio = int.Parse(socios); pedido.ClienteID = null; }
                if (pedido.Tipo == "cliente") { pedido.idSocio = int.Parse(socios); }
                float costoTotal = 0;
                foreach (var item in productos)
                {
                    Producto paux = new Producto();
                    paux = db.Productoes.Find(item.ProductoID);
                    costoTotal = costoTotal + (paux.Precio * item.Cantidad);
                }
                pedido.CostoTotal = costoTotal;
                db.Pedidoes.Add(pedido);
                db.SaveChanges();
                foreach (ProductoPedido prod in productos)
                {
                    if (prod.Eliminado == 0)
                    {
                        prod.Pedido = pedido;
                        db.ProductoPedidos.Add(prod);
                    }
                }
                db.SaveChanges();

                
                foreach (var item in productos)
                {
                    Producto pro = new Producto();
                    pro = db.Productoes.Single(p => p.ProductoID == item.ProductoID);
                    pro.Stock = pro.Stock - item.Cantidad;
                    db.SaveChanges();

                }

            //    var productosDePedido = (from p in db.Productoes
            //                             join pp in db.ProductoPedidos on p.ProductoID equals pp.ProductoID
            //                             where pp.PedidoID == pedido.PedidoID
            //                             select new
            //                             {
            //                                 p.Nombre,
            //                                 p.Empresa,
            //                                 pp.Cantidad,
            //                                 p.Precio,
            //                                 p.Presentacion,
            //                                 p.ProductoID

            //                             }).ToList();
            //    List<ProductoDePedido> detallesDePedido = new List<ProductoDePedido>();
            //    foreach (var item in productosDePedido)
            //    {
            //        ProductoDePedido pdp = new ProductoDePedido();
            //        pdp.Nombre = item.Nombre;
            //        pdp.Empresa = item.Empresa;
            //        pdp.Cantidad = item.Cantidad;
            //        pdp.Presentacion = item.Presentacion.NombrePresentacion;
            //        pdp.Costo = (item.Precio * item.Cantidad);
            //        pdp.productoID = item.ProductoID;
            //        pedido.CostoTotal = pedido.CostoTotal + pdp.Costo;
            //        detallesDePedido.Add(pdp);
            //    }

            //    db.SaveChanges();
            }
            catch
            {
                var query = (from s in db.Socios
                             select new
                             {

                                 NombreCompleto = s.Nombre + " " + s.Apellidos,
                                 SocioID = s.SocioID
                             }).ToList();
                ViewBag.Socios = new SelectList(query, "SocioID", "NombreCompleto", null);
                //ViewBag.Socios = new SelectList(db.Socios, "SocioID", "Nombre", null);
                ViewBag.ClienteID = new SelectList(new List<Cliente>(), "ClienteID", "Nombre", pedido.ClienteID);
                //ViewBag.ProductoID = new SelectList(db.Productoes, "ProductoID", "Nombre", pedido.ProductoID);
                TempData["Error"] = "Ocurrio algun problema al guardar el pedido!";
                return View(pedido);
            }
            TempData["Correcto"] = "Se registro el pedido!!";
            return RedirectToAction("Index");
            
        }

        // GET: /Pedido/Edit/5
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Pedido pedido = db.Pedidoes.Find(id);
            if (pedido == null)
            {
                return HttpNotFound();
            }
            ViewBag.ClienteID = new SelectList(db.Clientes, "ClienteID", "Nombre", pedido.ClienteID);

            var productosDePedido = (from p in db.Productoes
                                     join pp in db.ProductoPedidos on p.ProductoID equals pp.ProductoID
                                     where pp.PedidoID == id
                                     select new
                                     {
                                         p.Nombre,
                                         p.Empresa,
                                         pp.Cantidad,
                                         p.Precio,
                                         p.Presentacion,
                                         p.ProductoID

                                     }).ToList();
            List<ProductoDePedido> detallesDePedido = new List<ProductoDePedido>();
            foreach (var item in productosDePedido)
            {
                ProductoDePedido pdp = new ProductoDePedido();
                pdp.Nombre = item.Nombre;
                pdp.Empresa = item.Empresa;
                pdp.Cantidad = item.Cantidad;
                pdp.Presentacion = item.Presentacion.NombrePresentacion;
                pdp.Costo = (item.Precio * item.Cantidad);
                pdp.productoID = item.ProductoID;
                detallesDePedido.Add(pdp);
            }
            ViewBag.productos = detallesDePedido;

            ViewBag.pedidoID = id;
            return View(pedido);
        }

        // POST: /Pedido/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include="PedidoID,ClienteID,ProductoID,Cantidad,Fecha,CostoTotal")] Pedido pedido)
        {
            if (ModelState.IsValid)
            {
                db.Entry(pedido).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.ClienteID = new SelectList(db.Clientes, "ClienteID", "Nombre", pedido.ClienteID);
            return View(pedido);
        }

        // GET: /Pedido/Delete/5
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Pedido pedido = db.Pedidoes.Find(id);
            if (pedido == null)
            {
                return HttpNotFound();
            }
            return View(pedido);
        }
        public ActionResult DeleteProduct(int pid,int ppid)
        {
            var query = (from pp in db.ProductoPedidos
                         where pp.ProductoID == pid
                         select pp).FirstOrDefault();
            db.ProductoPedidos.Remove(query);
            db.SaveChanges();

            return RedirectToAction("Edit", new { id = ppid});
        }
        // POST: /Pedido/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            Pedido pedido = db.Pedidoes.Find(id);
            foreach (ProductoPedido p in pedido.ProductoPedidos.ToList())
            {
                Producto pro = new Producto();
                pro = db.Productoes.Single(p2 => p2.ProductoID == p.ProductoID);
                pro.Stock = pro.Stock + p.Cantidad;
                db.SaveChanges();
            }
            foreach (ProductoPedido p in pedido.ProductoPedidos.ToList())
            {
                db.ProductoPedidos.Remove(p);
            }
            db.SaveChanges();
            
            db.Pedidoes.Remove(pedido);
            db.SaveChanges();
            return RedirectToAction("Index");
        }


        // GET: /Pedido/Reporte
        public ActionResult Reporte()
        {
            var queryReporte = (from p in db.Pedidoes
                                join pp in db.ProductoPedidos on p.PedidoID equals pp.PedidoID
                                join spp in db.SalidaPorPedidos on pp.PedidoID equals spp.PedidoID
                                select new
                                {
                                    numeroPedido = pp.PedidoID,
                                    fechaIngresoPedido = p.Fecha,
                                    fechaDespachoPedido = spp.fecha,
                                    estado = p.Estado,
                                    tipo = p.Tipo
                                }).ToList();
            List<ReportePedido> lrp = new List<ReportePedido>();
            foreach (var item in queryReporte)
            {
                ReportePedido rp = new ReportePedido();
                rp.estado = item.estado;
                rp.fechaDespachoPedido = item.fechaDespachoPedido;
                rp.fechaIngresoPedido = item.fechaIngresoPedido;
                rp.idPedido = item.numeroPedido;
                rp.tipoDePedido = item.tipo;
                lrp.Add(rp);
                
            }
            ViewBag.reporte = lrp;
            return View();
        }
        //GET : /Pedido/ReporteBuscar
        public ActionResult ReporteBuscar(string FechaInicial , string FechaFinal, int? idPedido)
        {
            if (idPedido == null && FechaInicial != "" && FechaFinal != "")
            {
                var fi = DateTime.Parse(FechaInicial);
                var ff = DateTime.Parse(FechaFinal);
                var queryReporte = (from p in db.Pedidoes
                                    join pp in db.ProductoPedidos on p.PedidoID equals pp.PedidoID
                                    join spp in db.SalidaPorPedidos on pp.PedidoID equals spp.PedidoID
                                   // where p.PedidoID == idPedido
                                    where p.Fecha >= fi
                                    where p.Fecha <= ff
                                    select new
                                    {
                                        numeroPedido = pp.PedidoID,
                                        fechaIngresoPedido = p.Fecha,
                                        fechaDespachoPedido = spp.fecha,
                                        estado = p.Estado,
                                        tipoDePedido = p.Tipo
                                    }).ToList();
                List<ReportePedido> lrp = new List<ReportePedido>();
                foreach (var item in queryReporte)
                {
                    ReportePedido rp = new ReportePedido();
                    rp.estado = item.estado;
                    rp.fechaDespachoPedido = item.fechaDespachoPedido;
                    rp.fechaIngresoPedido = item.fechaIngresoPedido;
                    rp.idPedido = item.numeroPedido;
                    rp.tipoDePedido = item.tipoDePedido;
                    lrp.Add(rp);

                }
                ViewBag.reporte = lrp;
            }

            if (idPedido != null && FechaInicial != "" && FechaFinal != "")
            {
                var fi = DateTime.Parse(FechaInicial);
                var ff = DateTime.Parse(FechaFinal);
                var queryReporte = (from p in db.Pedidoes
                                    join pp in db.ProductoPedidos on p.PedidoID equals pp.PedidoID
                                    join spp in db.SalidaPorPedidos on pp.PedidoID equals spp.PedidoID
                                    where p.PedidoID == idPedido
                                    where p.Fecha >= fi
                                    where p.Fecha <= ff
                                    select new
                                    {
                                        numeroPedido = pp.PedidoID,
                                        fechaIngresoPedido = p.Fecha,
                                        fechaDespachoPedido = spp.fecha,
                                        estado = p.Estado,
                                        tipoDePedido = p.Tipo
               
                                    }).ToList();
                List<ReportePedido> lrp = new List<ReportePedido>();
                foreach (var item in queryReporte)
                {
                    ReportePedido rp = new ReportePedido();
                    rp.estado = item.estado;
                    rp.fechaDespachoPedido = item.fechaDespachoPedido;
                    rp.fechaIngresoPedido = item.fechaIngresoPedido;
                    rp.idPedido = item.numeroPedido;
                    rp.tipoDePedido = item.tipoDePedido;
                    lrp.Add(rp);

                }
                ViewBag.reporte = lrp;
            }
            if (idPedido == null && FechaFinal == "" || FechaInicial == "" )
            {
                var fi = DateTime.Today;
                var ff = DateTime.Today;
                var queryReporte = (from p in db.Pedidoes
                                    join pp in db.ProductoPedidos on p.PedidoID equals pp.PedidoID
                                    join spp in db.SalidaPorPedidos on pp.PedidoID equals spp.PedidoID
                                    // where p.PedidoID == idPedido
                                    //where p.Fecha >= fi
                                    //where p.Fecha <= ff
                                    select new
                                    {
                                        numeroPedido = pp.PedidoID,
                                        fechaIngresoPedido = p.Fecha,
                                        fechaDespachoPedido = spp.fecha,
                                        estado = p.Estado,
                                        tipoDePedido = p.Tipo
                                    }).ToList();
                List<ReportePedido> lrp = new List<ReportePedido>();
                foreach (var item in queryReporte)
                {
                    ReportePedido rp = new ReportePedido();
                    rp.estado = item.estado;
                    rp.fechaDespachoPedido = item.fechaDespachoPedido;
                    rp.fechaIngresoPedido = item.fechaIngresoPedido;
                    rp.idPedido = item.numeroPedido;
                    rp.tipoDePedido = item.tipoDePedido;
                    lrp.Add(rp);

                }
                ViewBag.reporte = lrp;
            }

            return View("Reporte");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}
